import os
import re
from enum import Enum, auto


class WinRarUnit(Enum):
    """
    枚举类，用于指定字节大小单位。
    - K: 单位为K。
    - KB: 单位为KB。
    - M: 单位为MB。
    - G: 单位为GB。
    """
    K = "K"
    KB = "KB"
    MB = "M"
    GB = "G"


class BandiZipUnit(Enum):
    """
    枚举类，用于指定字节大小单位。
    - K: 单位为K。
    - KB: 单位为KB。
    - MB: 单位为MB。
    - GB: 单位为GB。
    """
    K = "K"
    KB = "KB"
    MB = "MB"
    GB = "GB"


class OtherTool:

    @staticmethod
    def suffix_to_bytes(bytes_str: str):
        if bytes_str == "SevenZipCompressor":
            return BandiZipUnit
        else:
            return WinRarUnit

    @staticmethod
    def format_size(size_bytes, bytes_str: str = None):
        enum_unit = OtherTool.suffix_to_bytes(bytes_str)
        if size_bytes < 1024:
            return f"{size_bytes}{enum_unit.K.value}"
        elif size_bytes < 1024 * 1024:
            return f"{size_bytes / 1024:.2f}{enum_unit.KB.value}"
        elif size_bytes < 1024 * 1024 * 1024:
            return f"{size_bytes / (1024 * 1024):.2f}{enum_unit.MB.value}"
        else:
            return f"{size_bytes / (1024 * 1024 * 1024):.2f}{enum_unit.GB.value}"

    @staticmethod
    def can_extract_directly(file_path: str) -> bool:
        """
        判断文件是否可以直接解压（完整压缩文件或分卷首卷）

        参数:
            file_path (str): 文件路径

        返回:
            bool: 如果可以直接解压返回True，否则返回False

        规则:
            - 完整压缩文件: .7z, .zip, .rar, .tar 等直接返回True
            - 分卷首卷: .001, .z01, .part1.rar 等返回True
            - 分卷非首卷: .002, .z02, .r00 等返回False
        """
        filename = os.path.basename(file_path)
        name, ext = os.path.splitext(filename)

        # 常见可直接解压的扩展名列表
        archive_extensions = {
            '.7z', '.zip', '.rar', '.tar', '.gz', '.bz2', '.xz',
            '.lzma', '.lz4', '.zst', '.cab', '.arj', '.iso'
        }

        # 规则1: 完整的压缩文件（无分卷）
        if ext.lower() in archive_extensions:
            return True

        # 规则2: 分卷压缩的首卷文件
        # 匹配模式: .part1, .part01, .001, .z01, .rar
        first_volume_pattern = r"(\.part0*1(?:[^0-9]|$)|\.rar$|\.001$|\.z01$)"
        if re.search(first_volume_pattern, filename, re.IGNORECASE):
            return True

        # 规则3: 特殊格式的完整文件（如.tar.gz）
        # 检查多重扩展名 (如 .tar.gz)
        if '.' in name:
            _, second_ext = os.path.splitext(name)
            if (second_ext + ext).lower() in {'.tar.gz', '.tar.bz2', '.tar.xz'}:
                return True

        return False

class Mode(Enum):
    """
    枚举类，用于指定获取内容的模式。
    - FILE: 仅获取文件。
    - DIR: 仅获取目录。
    - ALL: 获取所有内容（文件和目录）。
    """
    FILE = auto()
    DIR = auto()
    ALL = auto()
